home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1035 / 1035.xpi / chrome / 1clickweather.jar / content / 1clickweather / js / config / configutils.js < prev    next >
Text File  |  2008-10-05  |  15KB  |  320 lines

  1. // ⌐ 2005 The Weather Channel Interactive, Inc.  All Rights Reserved.
  2.  
  3.  
  4. function ConfigUtils() {
  5.     this.separator = ",";  // use comma as 000's separator
  6.     this.decpoint = ".";  // use period as decimal point
  7.     this.percent = "%";
  8.     this.currency = "$";  // use dollar sign for currency
  9. }
  10.  
  11. ConfigUtils.prototype = {
  12.     separator : null,
  13.     decpoint : null,
  14.     percent : null,
  15.     currency : null,
  16.  
  17.     getUrl : function(appCfg, userCfg, dataKey, forcedLocation){
  18.        try{
  19.          var dataUrl = appCfg.getDataByName(dataKey).getDataURL().getBase();
  20.          if(forcedLocation){
  21.             dataUrl += forcedLocation;
  22.          }else if(dataKey != "Search"){ // search doesn't know what locid to use
  23.             dataUrl += userCfg.getAllProfiles().getDefaultProfile().getSetup().getLocation().getLocID();
  24.          }
  25.          dataUrl += '?';
  26.  
  27.          var urlParams = appCfg.getDataByName(dataKey).getDataURL().getParams();
  28.          var max = this.getHashSize(urlParams);
  29.          var paramCounter = 0;
  30.          for(var i in urlParams){
  31.             var name = urlParams[i].getName();
  32.             var val = "";
  33.  
  34.             switch(name){
  35.                // right now, if it's not standard units, force metric
  36.                case "unit":
  37.                   val = userCfg.getAllProfiles().getDefaultProfile().getSetup().getUnits().getName();
  38.                   if(val != 's'){
  39.                      val = 'm';
  40.                   }
  41.                   break;
  42.  
  43.                // some kinds of params only need a '*' to turn them on/off
  44.                case "cc":
  45.                case "swa":
  46.                   val = '*';
  47.                   break;
  48.  
  49.                // we need to turn the extended location on to get country/state
  50.                case "eloc":
  51.                   val = 'st';
  52.                   break;
  53.  
  54.                // the number of days has to include one extra day to account for the first day (day0) is not part
  55.                // of the max number of days to show in the extended forecast.
  56.                case "dayf":
  57.                   val = userCfg.getAllProfiles().getDefaultProfile().getExtForecast().getExtDetails().getDays();
  58.                   val++;
  59.  
  60.                   // now, if the user wants the first day's forecast to switch to tomorrow after 3pm, we need
  61.                   // an extra day of forecast data
  62.                   if(userCfg.getAllProfiles().getDefaultProfile().getForecast().getForecastSwitch() == "tomorrow"){
  63.                      val++;
  64.                   }
  65.  
  66.                   if(val > MAXFCSTDAYS){
  67.                      val = MAXFCSTDAYS;
  68.                   }else if(val < 1){
  69.                      val = 1;
  70.                   }
  71.                   break;
  72.             }
  73.  
  74.             // as long as we are not the first or last param element, put a '&' between params
  75.             if((paramCounter != 0) && (i != (max - 1))){
  76.                dataUrl += '&';
  77.             }
  78.             dataUrl += name + '=' + val;
  79.             paramCounter++;
  80.          }
  81.  
  82.          return(dataUrl);
  83.        }catch(e){
  84.           alert('cfg err: ' + e);
  85.        }
  86.     },
  87.  
  88.     getAppDataURL : function(myAppConfig, myDataElementName, myLocID, myParamValuesArray) {
  89.         try {
  90.             var urlBase = myAppConfig.getDataByName(myDataElementName).getDataURL().getBase();
  91.             var urlParams = myAppConfig.getDataByName(myDataElementName).getDataURL().getParams();
  92.  
  93.             var toRetURL = urlBase;
  94.             toRetURL += myLocID;
  95.             var i = 0;
  96.             var max = this.getHashSize(urlParams);
  97.             for(var nextParamKey in urlParams) {
  98.                 if(i == 0) {
  99.                     toRetURL += "?";
  100.                 }
  101.                 var nextParam = urlParams[nextParamKey];
  102.                 toRetURL += nextParam.getName();
  103.                 toRetURL += "=";
  104.                 // CHECK if the param name is "unit"
  105.                 var paramVal = myParamValuesArray[nextParam.getName()];
  106.                 if(nextParamKey == "unit") {
  107.                     if(paramVal != "s") {
  108.                         paramVal = "m";
  109.                     }
  110.                 }
  111.                 toRetURL += paramVal;
  112.  
  113.                 if(i != max - 1) {
  114.                     toRetURL += "&";
  115.                 }
  116.                 i++;
  117.             }
  118.             return toRetURL;
  119.         } catch(e) {
  120.             return "";
  121.         }
  122.     },
  123.  
  124.     getHashSize : function(myHash) {
  125.         var i = 0;
  126.         for(var nk in myHash) {
  127.             i++;
  128.         }
  129.         return i;
  130.     },
  131.  
  132.     convertData : function(myUserConfig, myDataElementName, xmlDoc) {
  133.         var myUnits = myUserConfig.getAllProfiles().getDefaultProfile().getSetup().getUnits().getName();
  134.         if(myUnits == "m" || myUnits == "s" || myUnits == "mk") {
  135.             // nothing to convert!
  136.         } else if(myUnits == "ms") {
  137.             // ASSUME THAT DATA CAME IN IN METRIC VALUES!!!!!!!!!
  138.             // WE NEED TO COVERT  SPEED FROM KM/H to M/S
  139.             if(myDataElementName == "Obs") {
  140.                 var newUS = xmlDoc.createElement("us");
  141.                 newUS.appendChild(xmlDoc.createTextNode("m/s"));
  142.                 xmlDoc.getElementsByTagName("head")[0].removeChild(xmlDoc.getElementsByTagName("head")[0].getElementsByTagName("us")[0]);
  143.                 xmlDoc.getElementsByTagName("head")[0].appendChild(newUS);
  144.  
  145.                 var windSpeedVal = xmlDoc.getElementsByTagName("s")[0].firstChild.nodeValue;
  146.                 var newWindSpeedVal = windSpeedVal * 0.277778;
  147.                 newWindSpeedVal = this.formatNumber(newWindSpeedVal, "##0");
  148.  
  149.                 var newWindSpeedElement = xmlDoc.createElement("s");
  150.                 newWindSpeedElement.appendChild(xmlDoc.createTextNode(newWindSpeedVal));
  151.  
  152.                 xmlDoc.getElementsByTagName("cc")[0].getElementsByTagName("wind")[0].removeChild(xmlDoc.getElementsByTagName("cc")[0].getElementsByTagName("wind")[0].getElementsByTagName("s")[0]);
  153.                 xmlDoc.getElementsByTagName("cc")[0].getElementsByTagName("wind")[0].appendChild(newWindSpeedElement);
  154.  
  155.             } else if(myDataElementName == "Fcst" || myDataElementName == "ExtFcst") {
  156.                 var newUS = xmlDoc.createElement("us");
  157.                 newUS.appendChild(xmlDoc.createTextNode("m/s"));
  158.                 xmlDoc.getElementsByTagName("head")[0].removeChild(xmlDoc.getElementsByTagName("head")[0].getElementsByTagName("us")[0]);
  159.                 xmlDoc.getElementsByTagName("head")[0].appendChild(newUS);
  160.  
  161.                 var allDays = xmlDoc.getElementsByTagName("dayf")[0].getElementsByTagName("day");
  162.                 var i =0;
  163.                 for(i=0;i<allDays.length;i++) {
  164.                     var newDay = allDays[i];
  165.                     var newDayParts = newDay.getElementsByTagName("part");
  166.                     var j = 0;
  167.                     for(j=0;j<newDayParts.length;j++) {
  168.                         var newDayPart = newDayParts[j];
  169.                         var windSpeedVal = newDayPart.getElementsByTagName("wind")[0].getElementsByTagName("s")[0].firstChild.nodeValue;
  170.                         var newWindSpeedVal = windSpeedVal * 0.277778;
  171.                         newWindSpeedVal = this.formatNumber(newWindSpeedVal, "##0");
  172.  
  173.                         var newWindSpeedElement = xmlDoc.createElement("s");
  174.                         newWindSpeedElement.appendChild(xmlDoc.createTextNode(newWindSpeedVal));
  175.  
  176.                         xmlDoc.getElementsByTagName("dayf")[0].getElementsByTagName("day")[i].getElementsByTagName("part")[j].getElementsByTagName("wind")[0].removeChild(xmlDoc.getElementsByTagName("dayf")[0].getElementsByTagName("day")[i].getElementsByTagName("part")[j].getElementsByTagName("wind")[0].getElementsByTagName("s")[0]);
  177.                         xmlDoc.getElementsByTagName("dayf")[0].getElementsByTagName("day")[i].getElementsByTagName("part")[j].getElementsByTagName("wind")[0].appendChild(newWindSpeedElement);
  178.  
  179.                     }
  180.                 }
  181.             } else {
  182.                 // dont know what kind of data this is!
  183.             }
  184.         } else if(myUnits == "uk"){
  185.             // ASSUME THAT DATA CAME IN IN METRIC VALUES!!!!!!!!!
  186.             // WE NEED TO CONVERT SPEED KM/H to MPH
  187.             if(myDataElementName == "Obs") {
  188.                 var newUS = xmlDoc.createElement("us");
  189.                 newUS.appendChild(xmlDoc.createTextNode("mph"));
  190.                 xmlDoc.getElementsByTagName("head")[0].removeChild(xmlDoc.getElementsByTagName("head")[0].getElementsByTagName("us")[0]);
  191.                 xmlDoc.getElementsByTagName("head")[0].appendChild(newUS);
  192.  
  193.                 var windSpeedVal = xmlDoc.getElementsByTagName("s")[0].firstChild.nodeValue;
  194.                 var newWindSpeedVal = windSpeedVal * 0.621371192;
  195.                 newWindSpeedVal = this.formatNumber(newWindSpeedVal, "##0");
  196.  
  197.                 var newWindSpeedElement = xmlDoc.createElement("s");
  198.                 newWindSpeedElement.appendChild(xmlDoc.createTextNode(newWindSpeedVal));
  199.  
  200.                 xmlDoc.getElementsByTagName("cc")[0].getElementsByTagName("wind")[0].removeChild(xmlDoc.getElementsByTagName("cc")[0].getElementsByTagName("wind")[0].getElementsByTagName("s")[0]);
  201.                 xmlDoc.getElementsByTagName("cc")[0].getElementsByTagName("wind")[0].appendChild(newWindSpeedElement);
  202.  
  203.             } else if(myDataElementName == "Fcst" || myDataElementName == "ExtFcst") {
  204.                 var newUS = xmlDoc.createElement("us");
  205.                 newUS.appendChild(xmlDoc.createTextNode("mph"));
  206.                 xmlDoc.getElementsByTagName("head")[0].removeChild(xmlDoc.getElementsByTagName("head")[0].getElementsByTagName("us")[0]);
  207.                 xmlDoc.getElementsByTagName("head")[0].appendChild(newUS);
  208.  
  209.                 var allDays = xmlDoc.getElementsByTagName("dayf")[0].getElementsByTagName("day");
  210.                 var i =0;
  211.                 for(i=0;i<allDays.length;i++) {
  212.                     var newDay = allDays[i];
  213.  
  214.                     var newDayParts = newDay.getElementsByTagName("part");
  215.                     var j = 0;
  216.                     for(j=0;j<newDayParts.length;j++) {
  217.                         var newDayPart = newDayParts[j];
  218.                         var windSpeedVal = newDayPart.getElementsByTagName("wind")[0].getElementsByTagName("s")[0].firstChild.nodeValue;
  219.                         var newWindSpeedVal = windSpeedVal * 0.621371192;
  220.                         newWindSpeedVal = this.formatNumber(newWindSpeedVal, "##0");
  221.  
  222.                         var newWindSpeedElement = xmlDoc.createElement("s");
  223.                         newWindSpeedElement.appendChild(xmlDoc.createTextNode(newWindSpeedVal));
  224.  
  225.                         xmlDoc.getElementsByTagName("dayf")[0].getElementsByTagName("day")[i].getElementsByTagName("part")[j].getElementsByTagName("wind")[0].removeChild(xmlDoc.getElementsByTagName("dayf")[0].getElementsByTagName("day")[i].getElementsByTagName("part")[j].getElementsByTagName("wind")[0].getElementsByTagName("s")[0]);
  226.                         xmlDoc.getElementsByTagName("dayf")[0].getElementsByTagName("day")[i].getElementsByTagName("part")[j].getElementsByTagName("wind")[0].appendChild(newWindSpeedElement);
  227.  
  228.                     }
  229.                 }
  230.             } else {
  231.                 // dont know what kind of data this is!
  232.             }
  233.         } else {
  234.             // dont know what to do....
  235.             // this is bigger problem
  236.         }
  237.         return xmlDoc;
  238.     },
  239.  
  240.   // Original JavaScript code of this function by Duncan Crombie: dcrombie@chirp.com.au
  241.   formatNumber : function(number, format) {  // use: formatNumber(number, "format")
  242.     if (number - 0 != number) return null;  // if number is NaN return null
  243.     var useSeparator = format.indexOf(this.separator) != -1;  // use separators in number
  244.     var usePercent = format.indexOf(this.percent) != -1;  // convert output to percentage
  245.     var useCurrency = format.indexOf(this.currency) != -1;  // use currency format
  246.     var isNegative = (number < 0);
  247.     number = Math.abs (number);
  248.     if (usePercent) number *= 100;
  249.     format = this.strip(format, this.separator + this.percent + this.currency);  // remove key characters
  250.     number = "" + number;  // convert number input to string
  251.  
  252.      // split input value into LHS and RHS using decpoint as divider
  253.     var dec = number.indexOf(this.decpoint) != -1;
  254.     var nleftEnd = (dec) ? number.substring(0, number.indexOf(".")) : number;
  255.     var nrightEnd = (dec) ? number.substring(number.indexOf(".") + 1) : "";
  256.  
  257.      // split format string into LHS and RHS using decpoint as divider
  258.     dec = format.indexOf(this.decpoint) != -1;
  259.     var sleftEnd = (dec) ? format.substring(0, format.indexOf(".")) : format;
  260.     var srightEnd = (dec) ? format.substring(format.indexOf(".") + 1) : "";
  261.  
  262.      // adjust decimal places by cropping or adding zeros to LHS of number
  263.     if (srightEnd.length < nrightEnd.length) {
  264.       var nextChar = nrightEnd.charAt(srightEnd.length) - 0;
  265.       nrightEnd = nrightEnd.substring(0, srightEnd.length);
  266.       if (nextChar >= 5) nrightEnd = "" + ((nrightEnd - 0) + 1);  // round up
  267.  
  268.       // patch provided by Patti Marcoux 1999/08/06
  269.       while (srightEnd.length > nrightEnd.length) {
  270.         nrightEnd = "0" + nrightEnd;
  271.       }
  272.  
  273.       if (srightEnd.length < nrightEnd.length) {
  274.         nrightEnd = nrightEnd.substring(1);
  275.         nleftEnd = (nleftEnd - 0) + 1;
  276.       }
  277.     } else {
  278.       for (var i=nrightEnd.length; srightEnd.length > nrightEnd.length; i++) {
  279.         if (srightEnd.charAt(i) == "0") nrightEnd += "0";  // append zero to RHS of number
  280.         else break;
  281.       }
  282.     }
  283.  
  284.      // adjust leading zeros
  285.     sleftEnd = this.strip(sleftEnd, "#");  // remove hashes from LHS of format
  286.     while (sleftEnd.length > nleftEnd.length) {
  287.       nleftEnd = "0" + nleftEnd;  // prepend zero to LHS of number
  288.     }
  289.  
  290.     if (useSeparator) nleftEnd = this.separate(nleftEnd, this.separator);  // add separator
  291.     var output = nleftEnd + ((nrightEnd != "") ? "." + nrightEnd : "");  // combine parts
  292.     output = ((useCurrency) ? this.currency : "") + output + ((usePercent) ? this.percent : "");
  293.     if (isNegative) {
  294.       // patch suggested by Tom Denn 25/4/2001
  295.       output = (useCurrency) ? "(" + output + ")" : "-" + output;
  296.     }
  297.     return output;
  298.   },
  299.  
  300.   // Original JavaScript code of this function by Duncan Crombie: dcrombie@chirp.com.au
  301.   strip : function(input, chars) {  // strip all characters in 'chars' from input
  302.     var output = "";  // initialise output string
  303.     for (var i=0; i < input.length; i++)
  304.       if (chars.indexOf(input.charAt(i)) == -1)
  305.         output += input.charAt(i);
  306.     return output;
  307.   },
  308.  
  309.   // Original JavaScript code of this function by Duncan Crombie: dcrombie@chirp.com.au
  310.   separate : function(input, separator) {  // format input using 'separator' to mark 000's
  311.     input = "" + input;
  312.     var output = "";  // initialise output string
  313.     for (var i=0; i < input.length; i++) {
  314.       if (i != 0 && (input.length - i) % 3 == 0) output += separator;
  315.       output += input.charAt(i);
  316.     }
  317.     return output;
  318.   }
  319. };
  320.